package com.idbk.chargestation.amap.base;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.View;

import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MyLocationStyle;
import com.idbk.chargestation.R;

/**
 * 显示地图和定位功能的高德地图基类
 * Created by zhx on 2017/8/24.
 */

public class BaseMapFragment extends Fragment implements AMap.OnMarkerClickListener, AMap.OnMapClickListener
        ,View.OnClickListener, AMap.OnCameraChangeListener {

    protected static final String TAG = BaseMapFragment.class.getSimpleName();
    //地图相关
    protected MapView mapView;
    protected AMap aMap;
    //定位服务类。此类提供单次定位、持续定位、地理围栏、最后位置相关功能。
    protected AMapLocationClient mLocationClient;
    //定位参数设置，通过这个类可以对定位的相关参数进行设置,在AMapLocationClient进行定位时需要这些参数
    protected AMapLocationClientOption mLocationOption;

    protected void initMapView(Bundle savedInstanceState, View mBaseView) {
        mapView = (MapView) mBaseView.findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);//必须要写 ,实现地图生命周期管理
        aMap = mapView.getMap();
        aMap.getUiSettings().setMyLocationButtonEnabled(false);//设置默认定位按钮是否显示
        aMap.getUiSettings().setTiltGesturesEnabled(false);//禁止倾斜手势
        aMap.getUiSettings().setRotateGesturesEnabled(false);//禁止旋转手势
        aMap.getUiSettings().setZoomControlsEnabled(false);//隐藏缩放按钮
        aMap.setOnCameraChangeListener(this);//设置视觉移动监听
        aMap.setOnMapClickListener(this);
        aMap.setOnMarkerClickListener(this);//设置点击marker事件监听器
        aMap.animateCamera(CameraUpdateFactory.changeTilt(0));//设定固定倾斜角度

        //定位小蓝点--从高德地图5.1开始
        MyLocationStyle myLocationStyle;
        myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点，定位点依照设备方向旋转，并且会跟随设备移动。（1秒1次定位）如果不设置myLocationType，默认也会执行此种模式。
        myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔，只在连续定位模式下生效，单次定位模式下不会生效。单位为毫秒。
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER);//连续定位、蓝点不会移动到地图中心点，地图依照设备方向旋转，并且蓝点会跟随设备移动。
        //自定义定位图标
        BitmapDescriptor bd = BitmapDescriptorFactory
                .fromBitmap(BitmapFactory
                        .decodeResource(getResources(), R.drawable.location_marker));
        myLocationStyle.myLocationIcon(bd);
        //
        aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
        aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点，false表示隐藏定位蓝点并不进行定位，默认是false。

    }

    protected void initLocation(Context mContext, AMapLocationListener locationListener){
        //初始化client
        mLocationClient = new AMapLocationClient(mContext.getApplicationContext());
        mLocationOption = getDefaultOption();
        //设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        // 设置定位监听
        mLocationClient.setLocationListener(locationListener);
    }

    private AMapLocationClientOption getDefaultOption(){
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选，设置定位模式，可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(false);//可选，设置是否gps优先，只在高精度模式下有效。默认关闭
        mOption.setHttpTimeOut(30000);//可选，设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(2000);//可选，设置定位间隔。默认为2秒
        mOption.setNeedAddress(true);//可选，设置是否返回逆地理地址信息。默认是true
        mOption.setOnceLocation(false);//可选，设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(false);//可选，设置是否等待wifi刷新，默认为false.如果设置为true,会自动变为单次定位，持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选， 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        mOption.setSensorEnable(false);//可选，设置是否使用传感器。默认是false
        mOption.setWifiScan(true); //可选，设置是否开启wifi扫描。默认为true，如果设置为false会同时停止主动刷新，停止以后完全依赖于系统刷新，定位位置可能存在误差
        mOption.setLocationCacheEnable(true); //可选，设置是否使用缓存定位，默认为true
        return mOption;
    }

    /**
     * 如果AMapLocationClient是在当前Activity实例化的，
     * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
     */
    private void destroyLocation(){
        if (null != mLocationClient) {
            mLocationClient.onDestroy();
            mLocationClient = null;
            mLocationOption = null;
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
        if(mLocationClient != null){
            Log.d(TAG,"mLocationClient startLocation");
            mLocationClient.startLocation();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
        if(mLocationClient != null){
            mLocationClient.stopLocation();
        }
    }

    //缓存页面相关数据数据
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
        destroyLocation();
    }


    @Override
    public void onMapClick(LatLng latLng) {

    }

    @Override
    public void onClick(View v) {

    }

    @Override
    public void onCameraChange(CameraPosition cameraPosition) {

    }

    @Override
    public void onCameraChangeFinish(CameraPosition cameraPosition) {

    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        return false;
    }
}
